package com.example.maple.ccsclient.view;

import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.AbsListView;
import android.widget.ScrollView;

/**
 * Created by maple on 2016/6/16.
 */
public class ObservableScrollView extends ScrollView {
	private ScrollViewListener mScrollViewListener;

	public ObservableScrollView(Context context) {
		super(context);
	}

	public ObservableScrollView(Context context, AttributeSet attrs) {
		super(context, attrs);
	}

	public ObservableScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
		super(context, attrs, defStyleAttr);
	}
	public void setScrollViewListener(ScrollViewListener scrollViewListener) {
		mScrollViewListener = scrollViewListener;
	}

	// 是否在触摸状态
	private boolean inTouch = false;
	// 上次滑动的最后位置
	private int lastT = 0;
	// 检查ScrollView的最终状态
	private static final int CHECK_STATE = 0;
	//拦截手动事件


	private Handler checkStateHandler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			if (lastT == getScrollY()) {
				// 如果上次的位置和当前的位置相同，可认为是在空闲状态
				mScrollViewListener.onScrollStateChanged(ObservableScrollView.this,
						ScrollViewListener.SCROLL_STATE_IDLE);

			}
		}
	};



	@Override
	public boolean onTouchEvent(MotionEvent ev) {

		switch (ev.getAction()){

			//当手指触摸到屏幕时候
			case MotionEvent.ACTION_DOWN :{

					break;
			}

			//当手指移动的时候
			case MotionEvent.ACTION_MOVE:{
				inTouch = true;
				break;
			}


			case MotionEvent.ACTION_CANCEL:{

				break;
			}

			//当手指离开时候发生
			case MotionEvent.ACTION_UP:{
				inTouch = false;
				lastT = getScrollY();
				checkStateHandler.removeMessages(CHECK_STATE);// 确保只在最后一次做这个check
				checkStateHandler.sendEmptyMessageDelayed(CHECK_STATE, 5);// 5毫秒检查一下
				break;
			}
			default:break;
		}

		return super.onTouchEvent(ev);
	}

	@Override
	public int computeVerticalScrollRange() {
		return super.computeVerticalScrollRange();
	}



	@Override
	protected void onScrollChanged(int x, int y, int oldx, int oldy) {
		super.onScrollChanged(x, y, oldx, oldy);

		if (inTouch) {
			if (y != oldy) {
				// 有手指触摸，并且位置有滚动

				mScrollViewListener.onScrollStateChanged(this,
						ScrollViewListener.SCROLL_STATE_TOUCH_SCROLL);
			}
		} else {
			if (y != oldy) {
				// 没有手指触摸，并且位置有滚动，就可以简单的认为是在fling

				mScrollViewListener.onScrollStateChanged(this,
						ScrollViewListener.SCROLL_STATE_FLING);
				// 记住上次滑动的最后位置
				lastT = y;
				checkStateHandler.removeMessages(CHECK_STATE);// 确保只在最后一次做这个check
				checkStateHandler.sendEmptyMessageDelayed(CHECK_STATE, 5);// 5毫秒检查一下
			}
		}

		if (mScrollViewListener != null) {
			mScrollViewListener.onScrollChanged(this, x, y, oldx, oldy);
		}
	}
}
